perm filename SCAN.FAI[NEW,LCS] blob sn#519462 filedate 1980-06-13 generic text, type T, neo UTF8
	TITLE SCANR
	ENTRY SCANR,LNEND,STFNUM
	EXTERNAL SCN,SC,ALF,NALF,EXP3.2,SCX,SCM,RMOD,JCHAR,A2Z,MKX
	ML←5 ↔ K←0 ↔ NNUM←14 ↔ ISKP←13 ↔ JJ←12 ↔ XMINUS←11 ↔ DECI←10
	M←7 ↔ N←6 ↔ QQ←4 ↔ TRIP←3 
	DEFINE LTT<A2Z+=19> ↔ DEFINE LZ<A2Z+=25> 
	DEFINE LM <A2Z+=12> ↔ DEFINE LN<A2Z+=13> ↔ DEFINE LP <A2Z+=15>
	DEFINE LL <A2Z+=11> ↔ DEFINE LR<A2Z+=17> ↔ DEFINE LBL <SCX+=11>
;;	DEFINE LL <SCN> ↔ DEFINE LR<SCN+1> ↔ DEFINE LBL <SCX+=11>
	DEFINE LSL <MKX> ↔ DEFINE LST <SCX+=7 > ↔DEFINE LCM<SCX>
;;	DEFINE LSL <SCN+4> ↔ DEFINE LST <SCX+=7 > ↔DEFINE LCM<SCX>
	DEFINE LE <A2Z+4> ↔ DEFINE LC <A2Z+2> ↔ DEFINE LS <A2Z+=18>
;;	DEFINE LE <SCN+5> ↔ DEFINE LC <SCN+6> ↔ DEFINE LS <SCN+7> 
	DEFINE LPL<SCX+=6 > ↔DEFINE LMI<SCX+1> ↔ DEFINE LF <A2Z+5>
;;	DEFINE LPL<SCX+=6 > ↔DEFINE LMI<SCX+1> ↔ DEFINE LF <SCN+=8>
	DEFINE LA <A2Z> ↔ DEFINE LI <A2Z+=8> ↔ DEFINE LW <A2Z+=22>
;;	DEFINE LA <SCN+=9> ↔ DEFINE LI <SCN+=10> ↔ DEFINE LW <SCN+=11>
	DEFINE JN <SC+=10> ↔ DEFINE DBST <SC+=11> ↔ DEFINE ISEMI <JCHAR+1>
	DEFINE IXX <A2Z+=23> ↔ DEFINE MODE <SC+=70> ↔ DEFINE VX <SC+=16>
	DEFINE LU <A2Z+=20> ↔ DEFINE LD <A2Z+3> ↔ DEFINE INP <ALF>
;;	DEFINE LU <SCN+2> ↔ DEFINE LD <SCN+3> ↔ DEFINE INP <ALF>
	DEFINE REXP<SC+6> ↔DEFINE DOT<SCX+2> ↔ DEFINE VX4 <SC+=19>
;;	DEFINE STAFF<SCM+=80>
IQ:	BLOCK 12
;	00100	C   SUBRS.   SCANR, NALF, EDIT, PRESCN
;	00300	C ***** MSS SCANNER *************************
;	00400	      SUBROUTINE SCANR
;	00500	      DIMENSION IQ(10),LRUD(4)
;	00600	      COMMON/ALF/INP(72),ML
;650	COMMON/SCN/LL,LR,LU,LD,LSL,LE,LC,LS,LF,LA,LI,LW
;	COMMON/SCX/JALPHA(30),J4,L,Y,K,RX,RZ,RA,J5 /JCHAR/IXX,ISEMI,JBLA,IG
;	00700	      COMMON /SC/J,L,MK
;	00800	     1 ,ISKP,XMINUS,N,REXP,LK,NNUM,JJ,JN,DBST,NFLG,JXX,JSEMI,QQ
;	00900	     1 ,VX(50),IAMP,K,RRN,M,MODE,IBLA
;1000  EQUIVALENCE  (IQ(1),VX(41)),(VX1,VX(1)),(VX2,VX(2)),(LDN,LRUD(4))
;	01100	      DATA LRUD/'L','R','U','D'/
;	01200	C  FOR LEFT, RIGHT, UP, DOWN, EDIT
SCANR:	0
	MOVE ML,ALF+=72		; 5 IS ML UNTIL RETURN
      	SETOM 	NNUM  	        ;1300	      NNUM=-1
      	SETZM 	ISKP  		;1400	      ISKP=0
      	SETZM 	JJ    	   ;	01500	      JJ=0
      	MOVSI 	XMINUS,201400	   ;	01600	      XMINUS=1.
			      ;	01700	C  LEAVES BLANK WHEN REST.
			      ;	01800	999      DECI=-1
S999: 	SETOM DECI		;INTEGER UNTIL S11!
      	SETZM 	M     	      ;	01900	      M=0
S2799:	MOVE  	N,INP   -1(ML)	    ;	02000	2799  N=INP(ML)
S899: 	AOS   	ML    	      ;	02100	899   ML=ML+1
	CAMN N,LSL      ;	02200	781   IF(N.EQ.'/')N=ISEMI
	MOVE N,ISEMI
				;2300	C   FOR MOTIVIC TRANFORMATIONS
      	CAME N,LST             ;02380	      IF(N.EQ.'*')GO TO 751
	CAMN N,ISEMI
      	JRST  	S751  	;	02400	      IF(N.EQ.ISEMI)GO TO 751
;	02500	C  '*' AND '/' ADDED ABOVE 4/18/73
      	CAMN N,IXX	    ;	02600	      IF(N.NE.IXX)GO TO 22
	SKIPGE SC+=10		;  JN
      	JRST  	S22   	     ;	02650	      IF(JN)GO TO 22
      	JUMPE 	ISKP,S210	;02700	      IF(ISKP.EQ.0)GO TO 210
      	SOS   	ML    	      ;	02800	      ML=ML-1
      	JRST  	S202  	      ;	02900	      GO TO 202
S22:  	CAMN  	N,LBL   	;3000	22    IF(N.EQ.IBLA)GO TO 4702
      	JRST  	S4702 	;	03050	      IF(N.NE.',')GO TO 510
      	CAME  	N,LCM    
      	JRST  	S510  
S4702:	JUMPGE ISKP,S2799 	;3100	4702      IF(ISKP)202,2799,2799
      	JRST  	S202  	      ;	03200	512   ML=ML+1
S512:	MOVE 2,ISEMI
 	AOS   	ML    	;	03300	      IF(INP(ML).EQ.ISEMI)RETURN
      	CAMN  	02,INP   -1(ML)
	JRST SEND
	JRST S512+1	     ;	03400	      GO TO 512
LRUD:	ASCII/L    /
	ASCII/R    /
	ASCII/U    /
	ASCII/D    /
S510: 	MOVE  	02,JN    	;3600	510   IF(JN.GE.0)GO TO 173
      	JUMPGE	02,S173  
      	MOVEI 	02,1     ;3700	C  SKIP(JN=+1) IF NOT COMING FROM 'EDIT'
      	MOVEM 	02,JN         ;	03800	      JN=1
      	MOVEI 	15,1	     ;	03900	      DO 702 K=1,4
;;S702: 	CAMN  	N,SCN  -1(15)	;4000	702   IF(N.EQ.LRUD(K))GO TO 703
;;    	JRST  	S703  
;!!!! 1/78	CAIGE 	15,4
;;    	CAIGE 	15,4      **************************
;;    	AOJA  	15,S702  	;	04100	C  FINDS L, R, U, D
S702: 	CAMN  	N,LRUD -1(15)	;4000	702   IF(N.EQ.LRUD(K))GO TO 703
    	JRST  	S703  
    	CAIGE 	15,4      
    	AOJA  	15,S702  	;	04100	C  FINDS L, R, U, D
;;;;	CAMN N,A2Z+=11		; L?
;;;;	JRST S703
;;;;	AOS 15 
;;;;	CAMN N,A2Z+=17		; R?
;;;;	JRST S703
;;;;	AOS 15
;;;;	CAMN N,A2Z+=20		; U?
;;;;	JRST S703
;;;;	AOS 15
;;;;	CAMN N,A2Z+=3		; D?
;;;;	JRST S703
	CAMLE N,LBL	;GO TO S703 IF REALLY A LETTER, ELSE MOVE UP POINTER
	JRST S899	;****** 1/78
S703: 	AOS   	JJ    ;	703   JJ=JJ+1	04200	 YOU CAN TYPE THE FULL WORD
	MOVE K,15	;	04400	      IF(K.NE.4)GO TO 77
	CAIE K,4
      	JRST  	S77   	;	04450	      IF(INP(ML).EQ.'E')K=99
	MOVE 2,LE
	CAMN 2,INP-1(ML)
	MOVEI K,=99	;	04500	C   'DE'=DELETE
S77:  	CAMN N,LE  ;	04600	77    IF(N.EQ.'E')K=55
	MOVEI K,=55 	;	04700	C   'E'= EDIT
	CAMN N,LC	;	04800	      IF(N.EQ.'C')K=2222
	MOVEI K,=2222		; COPY  04900	      IF(N.EQ.IXX)K=222
	CAMN N,IXX		; EXIT
	MOVEI K,=222  	;05000	C   'C'=COPY, 'X'=EXIT FROM EDIT MODE
	FLTR K,K	;	05100	      VX(JJ)=K
	MOVEM K,VX-1(JJ)	;05200	704   IF(INP(ML).EQ.IBLA)GO TO 2799
S704: 	SKIPL INP-1(ML)    ;IF(INP(ML).GT.0)GO TO 2799
	JRST S2799	; IF NEXT CHAR. IS A LETTER(NEG.), SKIP IT.
;	05300	C  PUT COMMA ERASER IN SCX.
	AOJA ML,S704		;05400	      ML=ML+1
;	05500	C  SO IT WILL SKIP 'D' AND 'EL' IN 'EDIT' AND 'DEL'
			; GO TO 704
S173: 	JSA   	16,NALF  	;	05700	173   K=NALF(N)
	JUMP N		; 0 IS K
	JUMPG N,S1410		;05800	      IF(N.GT.0)GO TO 1410
	CAIN =18		;5810	--R-- IF(K.EQ.18)GO TO 73
      	JRST  	S73   
      	MOVEI 	02,2	;	05815	C   JUMP IF A REST OR OTHER R'S
      	CAMN  	02,MODE      ;	05820	      IF(MODE.EQ.2)GO TO 144
      	JRST  	S144  
			;YOU CAN TYPE 'S', ETC., FOR SIXTEENTH ETC., RHYTHM.
			;  JUMP IF NOT A LETTER

; notes =  1xyz.0   x=accidental, yz=note num.,  negative=chord note
; rest  =  2xyz.0   z=0=ordinary, =1=invis., =2=whole, =3=repeat bar
;                   =4=down, =5=up, -2xyz=num. of meas. rest
; clefs =  3xyz.0   z=0=treble, =1=bass, =2=alto, =3=tenor, neg.=invis.
; use TRE,BAS,ALT,TEN for clefs with no change to note levels.(4,5,6,7)
; bars  =  4xyz.0   z=num. of staves up, neg.=dbl.bar
; ksig  = 17xyz.0   z=num. of accis.,  pos.=#, neg.=b,  x=1 for naturals.
; meter = 18xyz.n   xy=top num, zn=bottom num	(DONE IN SCMSS)
; stem  =  5xyz.0   YZ=10=stem up,  =20=stem down
; staff =  5xyz.0   z=0=return to norm., =1=lower stf., =2=upper stf.

	CAIGE =8        ;6100 --H--   IF(K.LT.8)GO TO 15
      	JRST  	S15   		;06200	C   JUMP IF A POSSIBLE NOTE
	CAIE =11	   ;6300  --K--	      IF(K.NE.11)GO TO 16
      	JRST  	S16   		;06400	C   JUMP IF NOT A KSIG
	MOVE QQ,[17000.0]	;QQ=17000   **** KEY SIGS ***
S18:  	MOVE  	N,INP-1(ML)     ;6500	18    N=INP(ML)
      	AOS   	ML     	      ;	06600	      ML=ML+1
	CAMN N,LBL		;IF(N.EQ.IBLA)GO TO 18
	JRST S18
;;	CAME N,[ASCIZ/N    /]  ; IS IT AN N?  K3FN/  OR  K2SN/ MAKES NATURALS
	CAME N,LN              ; IS IT AN N?  K3FN/  OR  K2SN/ MAKES NATURALS
	JRST S200	;IF NEXT CHAR='N' A 'NATURALS' KEY SIG.
	MOVE 2,[100.0]
	SKIPG QQ
	MOVNS 2
	FADR QQ,2
	JRST S18
S200:	CAME N,LS    	;	06750	      IF(N.EQ.'S')GO TO 18
   	CAMN  	N,LPL    ;	06775	      IF(N.EQ.'+')GO TO 18
      	JRST  	S18   	;	06800	      IF(N.EQ.ISEMI)GO TO 20
	CAMN N,ISEMI
      	JRST  	S20   ;	06900	      IF(N.EQ.'-')N='F'
   	CAMN  	N,LMI    
	JRST .+3                ;6950	      IF(N.NE.'F')GO TO 18
     	CAME  	N,LF     
      	JRST  	S19   	;	07200	19    A=NALF(N)
	MOVNS QQ		;NEG. FOR FLATS
	JRST S18		;GO BACK AND LOOK AGAIN
S19:  	JSA   	16,NALF  
	JUMP N
	FLTR K,K		;TLC K,232000
	JRST S18
S20:	JUMPL QQ,.+3
	FADR QQ,K
	SKIPA
  	FSBR QQ,K     	       ;07400	20    VX(1)=(17000.+A)*XMINUS
      	MOVEM 	QQ,VX    ;07500     KSIG
	JRST SEND	     ;	07600	      RETURN
S16:  	CAIE =9		     ;-- I --  7700	16    IF(K.NE.9)GO TO 2
      	JRST  	S2    
      	MOVSI 	02,205540	    ;	07800	      VX(1)=22.
      	MOVEM 	02,VX    	     ;	07900	C   FOR EDIT I21 ETC.
      	JRST  	S2799 	     		;8000	      GO TO 2799
S2:   	CAIE =13		; -- M --  08100  2     IF(K.NE.13)GO TO 3
      	JRST  	S3    	        ;8200	C   JUMP IF NOT A MEASURE LINE
;;      	MOVSI 	02,214764  	; ***** BARS =4000  ******
	MOVE 2,[4001.0]		; THE 1 IS FOR BAR ONE STAFF ONLY.
MM:	MOVE  	1,INP  -1(ML)	    ;08310	MM:       JN=INP(ML)
	MOVEM 1,JN
;;      	CAME  	1,LD    	    ;	08320	      IF(JN.NE.LD)GO TO 23
	CAMN 1,LD	;  IF (JN.EQ.LD)GO TO MD  ;; 	JRST  	S23   
	JRST MD
	CAME 1,[-=27245141952]	;IF (JN.NE.'M')GO TO 23
	JRST S23
	FADR 2,[1.0]	;VX(1)=VX(1)+1    GO TO MM
	AOJA ML,MM	; GO BACK AND LOOK FOR MORE M'S  ML=ML+1
MD:      	AOS   	ML    			;8330	      ML=ML+1
				     ;  FOUND 'MDN' -- FOR DOUBLE BARS
      	SETZM 	JN    			;8350	      JN=0
      	MOVNS 	02			;DBL BARS ARE NEG.
S23:  	MOVEM 	02,VX    
  	JSA 16,NALF
	JUMP INP-1(ML)		    ;8400	23    K=NALF(INP(ML))
      	JUMPLE	K,S512  	     ;	08500	      IF(K.LE.0)GO TO 512
	CAILE =9	       ; 08505	      IF(K.GT.9)GO TO 512
      	JRST  	S512  		;NO MORE THAN 8 STAVES UP ALLOWED.
	SOJ K,		;K=K-1  BECAUSE ORIG. NUM WAS 4001, NOT 4000
	SKIPN JN	   ;8510 OLD CODE HERE!      IF(JN.EQ.0)K=K+10
	MOVNS K 		;NEG. IF DBL BAR
	FLTR K,K		
      	FADRM 	K,VX           ;08600	C  'M2'= A BAR LINE UP 2 STAVES. ETC.
      	JRST  	S512  	     ;	08700	      GO TO 512
S3:   	CAILE =16	    ;-- P -- 08800	3     IF(K.GT.16)GO TO 4
      	JRST  	S4    	    ;	08900	C   JUMP IF NOT FOR 'PROXIMITY' MODE
	SUBI =15	    ;	09000	      NSWCH=K-15
      	MOVEM 	K,NSWCH#
      	JRST  	S2799 	    ;	09100	      GO TO 2799
;           TO SWITCH ALWAYS USE OCT.#  /PBF4/  /OE5/  P=PROXIMITY, O=ORDINARY
S4:	CAIE =20	   ;	09500	4     IF(K.NE.20)GO TO 21
      	JRST  	S21   	   ;	09600	C   TRY AGAIN IF NOT A 'T'
      	MOVE  	3,INP   -1(ML)	;09700	      IF(INP(ML).GT.0)GO TO 2799
      	JUMPG 3,S2799;T12,8/ ETC. MAKES A METR, OR TIM SIG. POS NUMS AREN'T LETRS!
      	MOVSI 02,214567  	; ***** CLEFS = 3000 *****  CODE 3.
	CAMN 3,LE
	FADR 2,[3.0]		; TENOR CLEF =3003, TREBLE=3000
      	JRST  	SCLEF 	    ;	10100	      GO TO SCLEF
S21:  	CAIE =19	   ; -- S -- 10200	21    IF(K.NE.19)GO TO 899
      	JRST  	S2799	;NOT AN 'S'(STEM), UNKNOWN ITEM, SKIP IT.
	MOVE 2,INP-1(ML)	;10600	      IF(INP(ML).EQ.LDN)VX(1)=5020.
      	MOVE  	03,[5000.0]	; SU  UP=5010
	CAMN 2,LU
	FADR 3,[10.0]
	CAMN 2,LD
	FADR 3,[20.0]   		;  DOWN = 5020
	CAMN 2,LPL	;IF(  .EQ.'+')   S+=5002
	FADR 3,[2.0]
	CAMN 2,LMI	;IF(  .EQ.'-')   S-=5001
	FADR 3,[1.0]	; IF(  .EQ.'0')  S0=5000
		;THESE ARE FOR S+, S-, S0; PUT NOTE ON OTHER STF.
      	MOVEM 	03,VX
      	JRST  	S512  	   ;	10700	      GO TO 512
S15:	MOVE  	N,INP   -1(ML)	    ;	11100	      N=INP(ML)
	CAIN K,2	;IF(1ST LETR.NE.'B')GO TO S5
      	CAME N,LA	    	;	11200	      IF(N.NE.'A')GO TO 5
      	JRST  	S5    	     ;	11300	C   JUMP IF NOT BASS CLEF
      	MOVE  	02,[3001.0]		;BASS CLEF=3001
SCLEF:	MOVE N,INP(ML)	;N=INP(ML+1)   GET 3RD CHAR. 
	CAMN N,LBL	;IF(N.EQ.' '.OR.N.EQ.'/'.OR.N.EQ.';')GO TO SCLF
	JRST SCLF	;IF 3RD CHAR IS SIGNIFICANT THEN SPECIAL CLEF
	CAME N,LSL	; 4,5,6,7 = 0,1,2,3 BUT NO INFLUENCE ON NOTE LEVEL
	CAMN N,ISEMI
	JRST SCLF
	FADR 2,[4.0]
	AOS ML		;ML=ML+1
SCLF:	MOVEM 	02,VX    
	SKIPGE XMINUS	    ;	11500	51    IF(XMINUS)VX(1)=-VX(1)
	MOVNS VX       ;11600	 TYPE '-BA' FOR INVISIBLE BASS CLEF, ETC.
      	JRST  	S512  
S5:   	CAME N,LL	   ;	11800	5     IF(N.NE.'L')GO TO 6
      	JRST  	S6    	   ;	11900	   JUMP IF NOT ALTO CLEF
      	MOVE  	02,[3002.0]
      	JRST  	SCLEF 
S6:	SUBI 2		; -2 BECAUSE MUSICAL ALPHABET STARTS WITH C
	SKIPG
	ADDI 7
	MOVE NNUM,K	; K IS AC0
	MOVEI QQ,=1000
   	MOVEI 	K,1	;6	K=1
	CAILE NNUM,3	   ;	12300	      IF(NNUM.GT.3)K=2
	AOJ K,			;12500	C   FOUND A NOTE
	CAMN N,IXX	    ;	12700	      IF(N.EQ.IXX)GO TO 5410
      	JRST  	S5410 	     ;	12800	C FOR GX3/ ETC.

	CAME N,INP-2(ML)		;IF(N.NE.INP(ML))GO TO SS6
	JRST SS6		; NO DOUBLE-LETTER ACCID. (FLAT)
	CAME N,INP(ML)		;IF(N.NE.INP(ML+1))GO TO S8-2
	JRST S8-2		;NO TRIPLE-LETTER ACCID. (SHARP)
	AOS ML			;ML=ML+1
	CAME N,INP(ML)		;IF(N.NE.INP(ML+1))GO TO S8 
	JRST S8			;NO TRIPLE-LETTER ACCID. (NATURAL)
	AOS ML			;ML=ML+1
	MOVEI QQ,=1300		;TYPE AA FOR AF, AAA = AS, AAAA = AN
	JRST S610

SS6:  	JSA   	16,NALF       ;	12900	      K=NALF(N)
	JUMP N
      	JUMPG 	N,S7     	;13000	      IF(N.GT.0)GO TO 7
			;13100	C   JUMP IF NOT A LETTER
	MOVEI QQ,=1300    ;  ***** NOTES  ***** =1000  2ND DIG=ACCI.
	CAIE =22	    ;*** CAN USE 'V' FOR NATURAL(EASIER TO HIT!!)
	CAIN =14	    ; --N-- = 13300	IF(K.EQ.14)GO TO 610
      	JRST  	S610  	      ;	13500	C   JUMP IF NATURAL
	CAIN =19	      ; -- S --	= 13400	 IF(K.EQ.19)GO TO 8
      	JRST  	S8    
      	MOVEI  QQ,=1100   	; IT'S A FLAT  
      	JRST  	S610  
S8:	MOVEI QQ,=1200   	; SHARP =1200
S610: 	AOS   	ML    	     ;	14100	610   ML=ML+1
      	JSA   	16,NALF  	;14200	      K=NALF(INP(ML))
	JUMP INP-1(ML)
	SKIPL INP-1(ML)		;IF CHAR. ISN'T A LETTER, GO TO S7
	JRST S7			; (LETTERS ARE NEG., NUMBS ARE POS.)
	CAIE =19		;IF(K.EQ.19) THEN IT'S SS
	JRST .+3		;FOR DBL FLAT, DBL SHARP
	MOVEI QQ,=1500  	;DBL FLAT
	JRST S610
	CAIE 6			;IS IT 'FF'?
	JRST S7
	MOVEI QQ,=1400   	;FF=1400, SS=1500
	JRST S610		; GO BACK FOR ANOTHER CHAR.
S7:	CAIN =11	      ;-- K -- ??? 14300 7    IF(K.EQ.11)GO TO 5410
      	JRST  	S5410 
	JUMPL K,S5410	    ;	14350	      IF(K.LT.0)GO TO 5410
			;14400	C   JUMP IF SEMICOLON OR BLANK
	CAIN =24	   ;-- X --14500    IF(K.NE.24)GO TO 24
      	JRST  	S5410 		    ;	14800	24    JSCA=K-1
S24:	MOVEM K,JSCA#		; SAVE OCT. NUM
      	AOS   	ML    	   ;	14900	      ML=ML+1
      	JRST  	S2410 
S5410:	SKIPN NSWCH 	;15300	5410  IF(NSWCH.EQ.0)GO TO 2410
      	JRST S2410
	MOVN  	JJ,NNUM  	;	15910	7410  JJ=NOLD-NNUM
      	ADD   	JJ,NOLD  
	CAIL JJ,4	   ;	15920	      IF(JJ.LT.4)GO TO 377
      	AOS JSCA
 	CAMG JJ,[-4]	   ;	16010	377   IF(JJ.GT.-4)GO TO 2410
      	SOS   	JSCA  
		;WILL JUMP TO NEAREST NOTE  (DIATONIC-'75)
S2410:	MOVEI 	JJ,1	;	16200	2410  JJ=1
      	SETZM 	VX+1  	;	16300	      VX2=0
	MOVE 2,JSCA	;VX1=(1000+ACCI*100+OCT*7+NNUM)*DBST
	IMULI 2,7
	ADD 2,NNUM
	ADD 2,QQ	; ADD 1000+OCT*7 (QQ)
	FLTR 2,2
	FMPR 2,DBST
	MOVEM 2,VX	  ;	16500	C  DOUBLE STOPS ARE NEG. NUMBERS
      	MOVEM 	NNUM,NOLD#	;	16600	      NOLD=NNUM
;;  ?S4410:	MOVNI 	NNUM,2	       ;16700	4410  NNUM=-2
S4410:     	MOVE  	02,ISEMI 	;16800	      IF(INP(ML).EQ.ISEMI)RETURN
      	CAMN  	02,INP   -1(ML)
	JRST SEND
		;ABOVE FINDS SCALE NOTES; IF NSWCH=0 OCT. NUM WILL STICK UNTIL RESET
      	JRST  	S310  
S210: 	AOS   	JJ    	;	17100	210   JJ=JJ+1
	CAIN JJ,1	;	17200	      IF(JJ.EQ.1)GO TO 3310
      	JRST  	S3310 
      	MOVSI 	XMINUS,201400	;	17300	      XMINUS=1.
      	SETZM 	VX    -1(JJ)	;	17400	      VX(JJ)=0
		;  'X N1,N2' MAY REPLACE 'REP N1,N2'.  N2=0 BECOMES N2=2
      	JRST  	S310  	 ;	17800	C   JUMP IF A LETTER
S1410:	MOVE MODE	;  17900	1410  IF(N.NE.'-')GO TO 14
	CAME N,LMI
      	JRST  	S544  
	MOVN XMINUS,[1.0]    ;	18000	      XMINUS=-1.
	JUMPE JJ,S2799	; IF(JJ.EQ.0)GO TO 2799  -- FOR '-BA' ETC.
	CAIN 1
	JRST S644	; IF(MODE.EQ.1)GO TO 644  [FOR AUTO OCT. SYS.]
	JRST S2799	;	18100	      GO TO 2799
S544:	CAIN 1  	; IF(N.NE.'+')GO TO 14
	CAME N,LPL
	JRST S14
S644:	MOVSI 7,203700   ; [7.0]   DEFAULT IS OCTAVE. (+ OR - 7)
	JSA 16,NALF
	JUMP ALF-1(ML)	;THE NEXT CHARACTER.
	CAIG =9
	SKIPG
	JRST S744	;NEXT IS NOT A NUMB.
	FLTR 7,0		;MOVE 7,0
	AOJ ML,
S744:	CAME N,LPL
	MOVNS 7
	MOVEM 7,VX4	; SEND IT TO SCMSS -- AT 71
	JRST S2799

			;	18102	144   TRIP=0
S144: 	SETZM 	TRIP
			;	18105	444   IF(K.EQ.8)VX1=2
S444: 	CAIE =8
	JRST .+3
	MOVSI 2,202400
	JRST SVX
	CAIE 4			;18107	      IF(K.EQ.4)VX1=.5
	JRST .+3
	MOVSI 2,200400
	JRST SVX
	CAIE 5	     ;	18110	      IF(K.EQ.5)VX1=8
	JRST .+3
      	MOVSI 	02,204400
	JRST SVX
	CAIE 7	   ;	18115	      IF(K.EQ.7)VX1=88
	JRST .+3
      	MOVSI 	02,207540
	JRST SVX
	CAIE =19	;	18120	      IF(K.EQ.19)VX1=16
	JRST .+3
      	MOVSI 	02,205400
	JRST SVX
	CAIE =20	;	18125	      IF(K.NE.20)GO TO 244
      	JRST  	S244  
      	MOVSI 	02,204600	    ;	18126	      VX1=12
      	MOVE  	N,INP   -1(ML)	    ;	18127	      N=INP(ML)
	CAME N,LBL	;	18129	      IF(N.EQ.LBL)GO TO 344
	CAMN N,ISEMI
;;    	JRST  	S344  	      ;	18131	      IF(N.EQ.ISEMI)GO TO 344
	JRST SVX
	CAIE N,1		;IF(N.EQ.1)GO TO SVX (DOT WAS CHANGED TO 1)
	CAMN N,IXX		; IF(N.EQ.IXX)GO TO SVX
	JRST SVX
      	MOVSI 	TRIP,576400	;	18133	      TRIP=-1
      	AOS   	ML    	      ;	18150	      ML=ML+1
      	JSA   	16,NALF  	   ;	18155	      K=NALF(N)
	JUMP N
	MOVE N,INP-1(ML)	; N=INP(ML)  *******
      	JRST  	S444  	     ;	18160	      GO TO 444
S244: 	CAIE =23	;	18220	244   IF(K.EQ.23)VX1=1
	JRST .+3
      	MOVSI 	02,201400
	JRST .+4
	CAIE =17	;	18222	      IF(K.EQ.17)VX1=4
	JRST .+3
      	MOVSI 	02,203400
SVX:     MOVEM 	02,VX	;	18223	C TS=24TH, TQ=6, TH=3.
	    ; FOR S,E,Q,H,W,D,T RHYTH.  'T'(K=20) =TRIPLET  D=DBL WHL NOTE
      	JUMPGE	TRIP,S344  	;18225	      IF(TRIP)VX1=VX1*1.5
	MOVSI 2,201600
      	FMPRM 	02,VX
S344: 	AOS   	JJ    	;	18226	344   JJ=JJ+1
      	JRST  	S1310 
	
S14:  	SETOM 	ISKP  	;	18230	14    ISKP=-1
	CAME N,DOT	;	18300	      IF(N.NE.'.')GO TO 79
      	JRST  	S79   
	MOVE DECI,M	;	18400	      DECI=M
      	JRST  	S75   
S79:  	AOS   	M     	;	18600	79    M=M+1
      	JSA   	16,NALF  	;18700	      IQ(M)=NALF(N)
	JUMP N
      	MOVEM 	00,IQ    -1(M)

S75:    CAMN N,ISEMI     	;18900	75    IF(N.EQ.ISEMI)GO TO 751
      	JRST  	S751  
      	MOVEI 	02,1	;	18950	      IF(INP(ML).NE.1)GO TO 2799
      	CAME  	02,INP   -1(ML)
      	JRST  	S2799 
S751: 	JUMPE ISKP,SEND	    ;	19000	751   IF(ISKP.EQ.0)RETURN
S202: 	CAME DECI,[-1]	   ;	19100	202   IF(DECI.NE.-1)GO TO 302
      	JRST  	S302  

      	SETZM 	DECI  	;	19200	      DECI=0

      	JRST  	S402  

S302: 	SUB DECI,M	;	19400	302   DECI=M-DECI
	MOVNS DECI	;	19500	402   RRN=0
S402: 	SETZM 	RRN#	;	19600	      REXP=M-1
      	MOVNI 	02,1
      	ADD   	02,M     
	FLTR 2,2		;TLC 2,232000
;;	FADR 2,2
	MOVEM 2,REXP	;	19700	      IF(M.LT.1)M=1
	CAIGE M,1
	MOVEI M,1	;	19800	      DO 171 K=1,M
      	MOVEI 	QQ,1		;USE QQ FOR INDEX
;	19900	      IF(REXP.GT.1)GO TO 1
S171: 	MOVSI 	02,201400
      	CAMGE 	02,REXP  
      	JRST  	S1    	;	20000	      RRV=10
      	MOVSI 	02,204500	; RRV IS IN 2
      	SKIPN REXP   ;	20100	      IF(REXP.EQ.0)RRV=1
      	MOVSI 	02,201400
      	JRST  	S11   	;	20300	1     RRV=10.**REXP
S1:   	MOVSI 	02,204500
      	MOVE  	03,REXP  
      	PUSHJ 	17,EXP3.2	;20400	11    RRN=RRN+IQ(K)*RRV
S11:  	FLTR 3,IQ-1(QQ)		;MOVE  	3,IQ-1(QQ)
      	FMPR  	2,3   
      	FADRM 	2,RRN   	;	20500	171     REXP=REXP-1
  	MOVSI 	02,576400
      	FADRM 	02,REXP  
      	CAMGE 	QQ,M     
      	AOJA  	QQ,S171  
	JUMPE DECI,.+6
	FLTR DECI,DECI		;TLC DECI,232000
      	MOVSI 	02,204500   ;	20600	      A=10.**DECI
      	MOVE  	03,DECI  
      	PUSHJ 	17,EXP3.2	; A WILL BE IN AC2
	SKIPA    ;	20700	      IF(DECI.EQ.0)A=1.
      	MOVSI 	02,201400	;	20800	      JJ=JJ+1
      	AOS   	JJ    	;	20900	      VX(JJ)=RRN/A*XMINUS
      	MOVE  	1,RRN   
      	FDVR  	1,2     
      	FMPR  	1,XMINUS
      	MOVEM 	1,VX    -1(JJ)	;	21000	      JN=-JN
      	MOVNS 	00,JN    ;21100	C   SETS IT TO -1 FOR L,R,U,D EDIT ROUTINE
      	MOVEI 	02,2	;	21200	      IF(MODE.NE.2)XMINUS=1.
      	CAME  	02,MODE  
	MOVMS XMINUS	;	21300	C************: MODE #?
;	21400	C  ONLY ONE - NEEDED FOR RHY.COMPOSITE
S1310:	MOVEI 	3,1    ;	21500	1310  IF(INP(ML).NE.1)GO TO 310
      	CAME  	3,INP -1(ML)
      	JRST  	S310  ;21600  VX(JJ+1)=VX(JJ)*2.  ; FOR DOTTED RHYTHMS
;;    	MOVE  	02,VX -1(JJ)
;;    	FSC   	02,1
;;    	MOVEM 	02,VX (JJ)	;	21700	      JJ=JJ+1
;;    	AOS   	JJ    	;	21800	      ML=ML+1
	MOVE 2,[1000.0]		;VX(JJ)=VX(JJ)+1000
	FADRM 2,VX-1(JJ)	;1000 IS ADDED FOR EACH DOT. NO MORE COMPOSITES!!
      	AOS   	ML    
      	JRST  	S1310 +1	;	22000	206   ML=ML+2
S206: 	ADDI ML,2	;	22100	3310  VX(1)=-99.
S3310:	MOVN  	02,[99.0]
      	MOVEM 	02,VX    	;	22200	310      ISKP=0
S310: 	SETZM 	ISKP  	;	22300	        IF(N.NE.ISEMI)GO TO 999
      	CAME  	N,ISEMI 
      	JRST  	S999  	;	22500	      RETURN
SEND:	MOVEM ML,ALF+=72
	MOVEM JJ,SC+=9
	JRA 16,(16)	;	22600	73    JJ=JJ+1
S73:  	AOS   	JJ    	;	22650	      K=INP(ML)
      	MOVE  	K,INP   -1(ML) ;22700	       IF(K.EQ.'E')GO TO 206
	CAMN K,LE
      	JRST  	S206  ;	  NEXT IS FOR A REST/R/ OR /RI/ FOR INVIS. REST
	CAMN K,LD   ;	22810	      IF(K.EQ.'D')GO TO 1073
      	JRST  	S1073 
		; /RD/ OR /RU/ = REST 6 DOWN OR 6 UP.
	CAMN K,LU   ;	22830	      IF(K.EQ.'U')GO TO 1173
      	JRST  	S1173 	;	22900	      IF(K.EQ.'I')GO TO 573
	CAMN K,LI
      	JRST  	S573  	;	22910	      IF(K.EQ.'W')GO TO 273
	CAMN K,LW
      	JRST  	S273  
		;  /RW/ MAKES WHOLE REST REGARDLESS OF TIME VALUE GIVEN.
	CAMN K,LR	;IF(K.EQ.'R')GO TO 1273
	JRST S1273	; /RR/ MAKES REPEAT BAR SIGN (REST=-4)

		; *** ADD NUMBERS LATER *****;	22932	      K=NALF(K)
      	JSA   	16,NALF  
	JUMP K	;	22934	      IF(K)GO TO 673
      	JUMPL 	K,S673  ;	22936	      IF(K.GE.10)GO TO 673
      	CAIL =10
      	JRST  	S673  	;	22940	973   KV=NALF(INP(ML+1))
S973:	MOVE 15,K
 	JSA 16,NALF
	JUMP INP(ML)
		;  FOR 3-DIG. NUMBS.   CAN TAKE NUM UP TO 999 FOR RESTS.
;	22942	      IF(KV)GO TO 873
	JUMPL S873	;22944	      IF(KV.GE.10)GO TO 873
	CAIL =10
      	JRST  	S873  	;	22945	      ML=ML+1
      	AOS   	ML    	;	22946	      K=K*10+KV
	IMULI 15,=10
      	IMUL  	02,K     
	ADD 15,K		; 15 IS K FOR NOW AND K IS IV
      	JRST  	S973+1

S873: 	ADDI 15,=2000		; QQ IS AC15 NOW.  RW =2002
	MOVNS 15
	FLTR 15,15		;TLC 15,232000
      	JRST  	S473  
S673: 	MOVSI	15,213764  	;QQ=2000
      	JRST  	S373  		;ORDINARY REST
S573: 	MOVE 	15,[2001.0]	;INVISIBLE REST
      	JRST  	S473  
S273: 	MOVE 	15,[2002.0]	;WHOLE REST (NO MATTER WHAT RHYTH.]
S473: 	AOS   	ML    	    ;	22990	473   ML=ML+1
S373: 	MOVEM 15,VX-1(JJ)	;	23000	373   VX(JJ)=QQ
      	JRST  	S4410 
S1073:	MOVSI 	15,213765  	;RD = REST DONW  2004
      	JRST  	S473  
S1173:	MOVE  	15,[2005.0]	;RU = REST UP  2005
      	JRST  	S473  
S1273:	MOVE 15,[2003.0]	;RR = BAR REPEAT SIGN 
	JRST S473		; FOR /RR/
	   	      ;23400	      END
LNEND:	0	;SEE FORTR. TEXT IN WORDS.F4
	SETZ 4,		;IF BAD INPUT PUT ISEMI INTO ALF(4) [INP1] AT END
	MOVE 0,LST    		; *   SCX+7
	MOVE 1,SCX+=9 		; ;
;;	MOVE 2,SCN+4  		; /
	MOVE 2,LSL    		; /
	SETZ  3,   		;AC3=0
	MOVEI 5,=71
;;;	MOVEI 3,=71
L2901:	CAME 2,ALF(3)
	JRST L2903
	MOVE 4,3		;AC4=AC3
;;;	MOVEM 1,ALF(3)
	JRST L2902		;GO TO L2902
;;;	JRA 16,(16)
L2903:	CAME 1,ALF(3)
	JRST L2902
	MOVEM 0,ALF(3)
	JRA 16,(16)
;;;L2902:	SKIPLE 3
L2902:	AOJ  3,     
	CAMG  3,5
	JRST L2901
	MOVEM 1,ALF(4)    	;GET LOC. OF LAST /
;;;	SOJA 3,L2901
	JRA 16,(16)
	   
STFNUM:	0	;FUNCTION STFNUM(STAFF)
	SETOM SCXNR#		;SCXNR=-1   FLAG
	SETZ 6,
STFN1:	MOVE 2,INP(6)
	MOVE 4,INP+1(6)
	CAME 2,LS		;IS INP1='S'?
	JRST NONUM
	CAME 4,LTT           	;  IF(INP(2).EQ.'T')STAFF=NEXT NUM
	CAMN 4,LP             	; IS IT A P?
;;	CAME 4,[ASCIZ/T    /]	;  IF(INP(2).EQ.'T')STAFF=NEXT NUM
;;	CAMN 4,[ASCIZ/P    /]	; IS IT A P?
	SKIPA
	JRST NONUM		;NO
	MOVE 3,LZ       	;PUT Z'S INTO FIRST LOCS.
;;	MOVE 3,[ASCIZ/Z    /]	;PUT Z'S INTO FIRST LOCS.
	MOVE ML,6		;ML=3+PTR
	ADDI ML,3
	MOVSI XMINUS,201400
	MOVE 2,INP+2(6)		;LOOK AT 3RD CHAR.
	CAME 2,LMI		;IS IT MINUS?
	JRST .+3
	MOVNS XMINUS
	AOJ ML,			;ML=ML+1
	JSA 16,NALF		;GET THE STAFF NUM.
	JUMP INP-1(ML)
	FLTR
	FMPR XMINUS
	CAME 4,LP     		;IF NOT 'P' GO TO STFN2
;;	CAME 4,[ASCIZ/P    /]	;IF NOT 'P' GO TO STFN2
	JRST STFN2
	SETOM SCX+=30		;RB=-1
	MOVEM RMOD+1		;SET4 IS NOW FILLED
	JRST STFN3-1
STFN2:	SETZM SCX+=30		;RB=0
	MOVEM @(16)	;TYPE STn/ TO SET STAFF NUM FOR ENTIRE LINE.
	MOVE ML,6  
STFN3:	MOVE 2,INP(ML)		;LOOK FOR THE SLASH AND THROW ALL AWAY
	MOVEM 3,INP(ML)		;SKIP UNTIL SEMI (CHANGED FROM SLASH AT S899)
	AOJ ML,
	CAME 2,LSL  
	JRST STFN3
   	SETZM SCXNR		;RETURN A ZERO
	MOVE 6,ML
	JRST STFN1		;GO BACK AND LOOK FOR MORE.
NONUM:	MOVE SCXNR		;NO STAFF NUM, RETURN A -1
	JRA 16,1(16)

	END